﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Noris.Tools.TraceVisualiser.TraceData;
using Noris.Tools.TraceVisualiser.Components;
using Noris.Tools.TraceVisualiser.Support;

namespace Noris.Tools.TraceVisualiser.Forms
{
    public partial class TraceDocumentForm : Noris.Tools.TraceVisualiser.Components.DForm
    {
		#region Konstrukce
		public TraceDocumentForm()
        {
            InitializeComponent();
            this._RegisterEvents();
        }
        /// <summary>
        /// Hlavička dokumentu = soubor "Projekt", vlastnosti projektu. Setování způsobí načtení dat dokumentu a datovou inicializaci.
        /// </summary>
        [EditorBrowsable(EditorBrowsableState.Never)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public TraceDocument Document
        {
            get { return this._TraceDocumentPanel.Document; }
            set { this._TraceDocumentPanel.Document = value; this._SetText(); }
        }
        /// <summary>
        /// Zdroj trace dat, komunikuje s grafem, z datového dokumentu dostává zadání (umístění souborů a parametry zpracování).
        /// </summary>
        [EditorBrowsable(EditorBrowsableState.Never)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public TraceDataSource DataSource { get { return (this._TraceDocumentPanel == null ? null : this._TraceDocumentPanel.DataSource); } }
        /// <summary>
        /// Grafický panel, který zobrazuje data
        /// </summary>
        [EditorBrowsable(EditorBrowsableState.Never)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        internal TraceVisualiser.TraceData.TraceDocumentPanel TraceDocumentPanel { get { return this._TraceDocumentPanel; } }
        /// <summary>
        /// Zobrazovací jednotka - graf třídy DColGrid. Je napojen na datový zdroj DataSource.
        /// </summary>
        [EditorBrowsable(EditorBrowsableState.Never)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        internal TraceVisualiser.Components.DColGrid Graph { get { return (this._TraceDocumentPanel == null ? null : this._TraceDocumentPanel.Graph); } }
		/// <summary>
		/// Reference na hlavní okno aplikace.
		/// Reference se plní při vytváření tohoto okna, v metodě TraceDocument.ShowTraceDataForm().
		/// </summary>
		[EditorBrowsable(EditorBrowsableState.Never)]
		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
		internal TraceVisualiser.Forms.MainAppForm MainAppForm { get; set; }
        /// <summary>
        /// Do formuláře promítne aktuální vlastnosti datového dokumentu
        /// </summary>
        private void _SetText()
        {
            TraceDocument document = this.Document;
            string title = (document != null ? document.DocumentName : null);
            if (String.IsNullOrEmpty(title))
                title = "Nepojmenovaný projekt";
            this.Text = title;
        }
        protected void DataDispose()
        {
            if (this.DataSource != null)
                this.DataSource.Dispose();
            if (this.Document != null)
                this.Document.Dispose();
            if (this._TraceDocumentPanel != null)
                this._TraceDocumentPanel.Dispose();
        }
		public override void Refresh()
		{
			if (this._TraceDocumentPanel != null)
				this._TraceDocumentPanel.Refresh();
			base.Refresh();
		}
		#endregion
        #region Eventy - transparentní
        /// <summary>
        /// Event, který bude vyvolán při změnách zobrazeného času na časové ose
        /// </summary>
        [Browsable(true)]
        [Category("Action")]
        [Description("Event, který bude vyvolán při změnách zobrazeného času na časové ose")]
        internal event TimeAxisChangeHandler TimeAxisChange;
        /// <summary>
        /// Zaregistruje svoje eventhandlery do eventů svých objektů
        /// </summary>
        private void _RegisterEvents()
        {
            this.TraceDocumentPanel.TimeAxisChange += this._TimeAxisChange;
			this.TraceDocumentPanel.UndoRedoChange += this._UndoRedoChange;
        }
        /// <summary>
        /// Předání eventu TimeAxisChange z this.Graph do nadřízené vrstvy
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _TimeAxisChange(object sender, TimeAxisChangeEventArgs e)
        {
            if (this.TimeAxisChange != null)
                this.TimeAxisChange(this, e);
        }
        #endregion
        #region Property
        /// <summary>
        /// Obsahuje (vždy nově generuje) seznam všech aktuálně vybraných elementů.
        /// </summary>
        public IEnumerable<IDataElement> SelectedElements { get { return this.Graph.Grid.SelectedElements; } }

        #endregion
        #region Metody
        /// <summary>
        /// Akceptuje daný pointer
        /// </summary>
        /// <param name="graphPointer"></param>
        /// <param name="setFocus"></param>
        public void GraphPointerAccept(IGraphPointer graphPointer)
        {
            this.GraphPointerAccept(graphPointer, false);
        }
        /// <summary>
        /// Akceptuje daný pointer
        /// </summary>
        /// <param name="graphPointer"></param>
        /// <param name="setFocus"></param>
        public void GraphPointerAccept(IGraphPointer graphPointer, bool setFocus)
        {
            if (this.Graph != null)
            {
                if (this.Document != null)
                    this.Document.CurrentDocPointer = graphPointer;

                this.Graph.GraphPointerAccept(graphPointer);

                if (setFocus)
                    this.Graph.Focus();
            }

            if (setFocus)
                this.Focus();
        }
        #endregion
        #region Undo/Redo registr
        /// <summary>
        /// Správce fronty UndoRedo
        /// </summary>
        internal Support.UndoRedoCls UndoRedo { get { return this.TraceDocumentPanel.UndoRedo; } }
		/// <summary>
		/// Vyvolá provedení akce Undo/Redo
		/// </summary>
		/// <param name="actionType"></param>
		public void UndoRedoAction(UndoRedoActionType actionType)
		{
			this.TraceDocumentPanel.UndoRedoAction(actionType);
		}
		/// <summary>
		/// Handler po změně Undo/Redo
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void _UndoRedoChange(object sender, EventArgs e)
		{
			MainAppForm mainAppForm = this.MainAppForm;
			if (mainAppForm == null)
			{
				Form mainForm = Steward.MainForm;
				if (mainForm == null) return;
				mainAppForm = mainForm as MainAppForm;
				if (mainAppForm == null) return;
			}
			mainAppForm.OnUndoRedoChanged(e);
		}
		#endregion
    }
}
